package com.principle.template;

public abstract class AbstractTemplateClass {

	protected abstract void firstStep();
	
	protected abstract void secondStep();
	
	
	/**
	 * 钩子方法，可有子类控制公共部分的运行
	 * @return
	 */
	protected boolean isNeedSecondStep() {
		return true;
	}
	
	/**
	 * 该方法不允许子类覆盖
	 */
	public final void run(){
		this.firstStep();
		if (isNeedSecondStep()) {
			this.secondStep();
		}
	} 

}
